home *** CD-ROM | disk | FTP | other *** search
/ X User Tools / X User Tools (O'Reilly and Associates)(1994).ISO / sun4c / archive / tcltk.z / tcltk / man / cat3 / ParseArgv.3 < prev    next >
Text File  |  1994-09-20  |  19KB  |  529 lines

  1.  
  2.  
  3.  
  4. Tk_ParseArgv(3)       Tk Library Procedures
  5.  
  6.  
  7.  
  8. _________________________________________________________________
  9.  
  10. NAME
  11.      Tk_ParseArgv - process command-line options
  12.  
  13. SYNOPSIS
  14.      #include <tk.h>
  15.  
  16.      int
  17.      Tk_ParseArgv(_i_n_t_e_r_p, _t_k_w_i_n, _a_r_g_c_P_t_r, _a_r_g_v, _a_r_g_T_a_b_l_e, _f_l_a_g_s)
  18.  
  19. ARGUMENTS
  20.      Tcl_Interp    *_i_n_t_e_r_p     (in)      Interpreter to  use  for
  21.                                          returning   error   mes-
  22.                                          sages.
  23.  
  24.      Tk_Window     _t_k_w_i_n       (in)      Window to use when argu-
  25.                                          ments     specify     Tk
  26.                                          options.  If NULL,  then
  27.                                          no  Tk  options  will be
  28.                                          processed.
  29.  
  30.      int           _a_r_g_c_P_t_r     (in/out)  Pointer  to  number   of
  31.                                          arguments in argv;  gets
  32.                                          modified to hold  number
  33.                                          of unprocessed arguments
  34.                                          that  remain  after  the
  35.                                          call.
  36.  
  37.      char          **_a_r_g_v      (in/out)  Command  line  arguments
  38.                                          passed  to main program.
  39.                                          Modified to hold  unpro-
  40.                                          cessed   arguments  that
  41.                                          remain after the call.
  42.  
  43.      Tk_ArgvInfo   *_a_r_g_T_a_b_l_e   (in)      Array    of     argument
  44.                                          descriptors,  terminated
  45.                                          by  element  with   type
  46.                                          TK_ARGV_END.
  47.  
  48.      int           _f_l_a_g_s       (in)      If  non-zero,  then   it
  49.                                          specifies  one  or  more
  50.                                          flags that  control  the
  51.                                          parsing   of  arguments.
  52.                                          Different flags  may  be
  53.                                          OR'ed together.  The
  54.                                          flags currently defined
  55.                                          are
  56.                                          TK_ARGV_DONT_SKIP_FIRST_ARG,
  57.                                          TK_ARGV_NO_ABBREV,
  58.                                          TK_ARGV_NO_LEFTOVERS,
  59.                                          and TK_ARGV_NO_DEFAULTS.
  60.  
  61.  
  62.  
  63. Tk                                                              1
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70. Tk_ParseArgv(3)       Tk Library Procedures
  71.  
  72.  
  73.  
  74. _________________________________________________________________
  75.  
  76. DESCRIPTION
  77.      Tk_ParseArgv processes an array  of  command-line  arguments
  78.      according  to a table describing the kinds of arguments that
  79.      are expected.  Each of the arguments in _a_r_g_v is processed in
  80.      turn:   if  it  matches  one of the entries in _a_r_g_T_a_b_l_e, the
  81.      argument is processed according to that entry and discarded.
  82.      The  arguments  that  do  not match anything in _a_r_g_T_a_b_l_e are
  83.      copied down to the beginning of _a_r_g_v (retaining their origi-
  84.      nal  order)  and  returned to the caller.  At the end of the
  85.      call Tk_ParseArgv sets *_a_r_g_c_P_t_r to hold the number of  argu-
  86.      ments  that  are  left in _a_r_g_v, and _a_r_g_v[*_a_r_g_c_P_t_r] will hold
  87.      the value NULL.  Normally, Tk_ParseArgv assumes that _a_r_g_v[_0]
  88.      is  a  command  name, so it is treated like an argument that
  89.      doesn't match _a_r_g_T_a_b_l_e and returned to the caller;  however,
  90.      if  the TK_ARGV_DONT_SKIP_FIRST_ARG bit is set in _f_l_a_g_s then
  91.      _a_r_g_v[_0] will be processed just like the  other  elements  of
  92.      _a_r_g_v.
  93.  
  94.      Tk_ParseArgv normally returns the value TCL_OK.  If an error
  95.      occurs  while  parsing  the  arguments,  then  TCL_ERROR  is
  96.      returned and Tk_ParseArgv will leave  an  error  message  in
  97.      _i_n_t_e_r_p->_r_e_s_u_l_t in the standard Tcl fashion.  In the event of
  98.      an error return, *_a_r_g_v_P_t_r will not have been  modified,  but
  99.      _a_r_g_v  could  have  been  partially  modified.   The possible
  100.      causes of errors are explained below.
  101.  
  102.      The _a_r_g_T_a_b_l_e array specifies the kinds of arguments that are
  103.      expected;  each of its entries has the following structure:
  104.  
  105.           typedef struct {
  106.               char*_k_e_y;
  107.               int _t_y_p_e;
  108.               char*_s_r_c;
  109.               char*_d_s_t;
  110.               char*_h_e_l_p;
  111.           } Tk_ArgvInfo;
  112.  
  113.  
  114.      The _k_e_y field is a string such as  ``-display''  or  ``-bg''
  115.      that  is  compared  with the values in _a_r_g_v.  _T_y_p_e indicates
  116.      how to process an argument that matches _k_e_y  (more  on  this
  117.      below).   _S_r_c and _d_s_t are additional values used in process-
  118.      ing the argument.  Their exact usage depends  on  _t_y_p_e,  but
  119.      typically  _s_r_c  indicates a value and _d_s_t indicates where to
  120.      store the value.  The char * declarations for  _s_r_c  and  _d_s_t
  121.      are  placeholders:   the  actual  types  may  be  different.
  122.      Lastly, _h_e_l_p is a string giving a brief description of  this
  123.      option;   this  string  is  printed  when users ask for help
  124.      about command-line options.
  125.  
  126.  
  127.  
  128.  
  129. Tk                                                              2
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136. Tk_ParseArgv(3)       Tk Library Procedures
  137.  
  138.  
  139.  
  140.      When processing an argument in _a_r_g_v,  Tk_ParseArgv  compares
  141.      the argument to each of the _k_e_y's in _a_r_g_T_a_b_l_e.  Tk_ParseArgv
  142.      selects the first specifier whose _k_e_y matches  the  argument
  143.      exactly, if such a specifier exists.  Otherwise Tk_ParseArgv
  144.      selects a specifier for  which  the  argument  is  a  unique
  145.      abbreviation.   If the argument is a unique abbreviation for
  146.      more than one specifier, then  an  error  is  returned.   If
  147.      there is no matching entry in _a_r_g_T_a_b_l_e, then the argument is
  148.      skipped and returned to the caller.
  149.  
  150.      Once a matching argument specifier  is  found,  Tk_ParseArgv
  151.      processes  the  argument  according to the _t_y_p_e field of the
  152.      specifier.  The argument that matched _k_e_y  is  called  ``the
  153.      matching  argument''  in the descriptions below.  As part of
  154.      the processing, Tk_ParseArgv may also use the next  argument
  155.      in  _a_r_g_v  after the matching argument, which is called ``the
  156.      following argument''.  The legal values for  _t_y_p_e,  and  the
  157.      processing that they cause, are as follows:
  158.  
  159.      TK_ARGV_END
  160.           Marks the end of the table.  The last entry in _a_r_g_T_a_b_l_e
  161.           must  have  this  type;   all  of  its other fields are
  162.           ignored and it will never match any arguments.
  163.  
  164.      TK_ARGV_CONSTANT
  165.           _S_r_c is treated as an integer and _d_s_t is  treated  as  a
  166.           pointer  to  an  integer.   _S_r_c is stored at *_d_s_t.  The
  167.           matching argument is discarded.
  168.  
  169.      TK_ARGV_INT
  170.           The following argument must contain an  integer  string
  171.           in the format accepted by strtol (e.g. ``0'' and ``0x''
  172.           prefixes may be used to specify  octal  or  hexadecimal
  173.           numbers, respectively).  _D_s_t is treated as a pointer to
  174.           an integer;  the following argument is converted to  an
  175.           integer value and stored at *_d_s_t.  _S_r_c is ignored.  The
  176.           matching and following  arguments  are  discarded  from
  177.           _a_r_g_v.
  178.  
  179.      TK_ARGV_FLOAT
  180.           The following argument must  contain  a  floating-point
  181.           number  in  the  format  accepted  by  strtol.   _D_s_t is
  182.           treated as the address of an double-precision  floating
  183.           point  value;  the following argument is converted to a
  184.           double-precision value and stored at *_d_s_t.  The  match-
  185.           ing and following arguments are discarded from _a_r_g_v.
  186.  
  187.      TK_ARGV_STRING
  188.           In this form, _d_s_t is treated as a pointer  to  a  (char
  189.           *);  Tk_ParseArgv  stores at *_d_s_t a pointer to the fol-
  190.           lowing argument, and discards the matching and  follow-
  191.           ing arguments from _a_r_g_v.  _S_r_c is ignored.
  192.  
  193.  
  194.  
  195. Tk                                                              3
  196.  
  197.  
  198.  
  199.  
  200.  
  201.  
  202. Tk_ParseArgv(3)       Tk Library Procedures
  203.  
  204.  
  205.  
  206.      TK_ARGV_UID
  207.           This form is similar to TK_ARGV_STRING, except that the
  208.           argument  is turned into a Tk_Uid by calling Tk_GetUid.
  209.           _D_s_t is treated as a pointer to a  Tk_Uid;  Tk_ParseArgv
  210.           stores  at *_d_s_t the Tk_Uid corresponding to the follow-
  211.           ing argument, and discards the matching  and  following
  212.           arguments from _a_r_g_v.  _S_r_c is ignored.
  213.  
  214.      TK_ARGV_CONST_OPTION
  215.           This form causes a Tk option  to  be  set  (as  if  the
  216.           option  command  had  been  invoked).  The _s_r_c field is
  217.           treated as a pointer to a string giving the value of an
  218.           option,  and _d_s_t is treated as a pointer to the name of
  219.           the option.  The matching argument  is  discarded.   If
  220.           _t_k_w_i_n  is  NULL,  then argument specifiers of this type
  221.           are ignored (as if they did not exist).
  222.  
  223.      TK_ARGV_OPTION_VALUE
  224.           This form is similar  to  TK_ARGV_CONST_OPTION,  except
  225.           that  the value of the option is taken from the follow-
  226.           ing argument instead of from _s_r_c.  _D_s_t is used  as  the
  227.           name  of the option.  _S_r_c is ignored.  The matching and
  228.           following arguments are discarded.  If _t_k_w_i_n  is  NULL,
  229.           then  argument  specifiers of this type are ignored (as
  230.           if they did not exist).
  231.  
  232.      TK_ARGV_OPTION_NAME_VALUE
  233.           In this case the following argument  is  taken  as  the
  234.           name  of  a  Tk  option  and the argument after that is
  235.           taken as the value for that option.  Both _s_r_c  and  _d_s_t
  236.           are  ignored.   All  three arguments are discarded from
  237.           _a_r_g_v.  If _t_k_w_i_n is NULL, then  argument  specifiers  of
  238.           this type are ignored (as if they did not exist).
  239.  
  240.      TK_ARGV_HELP
  241.           When this kind of option is  encountered,  Tk_ParseArgv
  242.           uses  the  _h_e_l_p  fields of _a_r_g_T_a_b_l_e to format a message
  243.           describing all the valid  arguments.   The  message  is
  244.           placed   in  _i_n_t_e_r_p->_r_e_s_u_l_t  and  Tk_ParseArgv  returns
  245.           TCL_ERROR.  When  this  happens,  the  caller  normally
  246.           prints  the  help message and aborts.  If the _k_e_y field
  247.           of a TK_ARGV_HELP specifier is NULL, then the specifier
  248.           will  never  match  any  arguments;   in  this case the
  249.           specifier simply provides  extra  documentation,  which
  250.           will  be  included  when  some other TK_ARGV_HELP entry
  251.           causes help information to be returned.
  252.  
  253.      TK_ARGV_REST
  254.           This option is used by programs or commands that  allow
  255.           the last several of their options to be the name and/or
  256.           options for some  other  program.   If  a  TK_ARGV_REST
  257.           argument  is  found,  then Tk_ParseArgv doesn't process
  258.  
  259.  
  260.  
  261. Tk                                                              4
  262.  
  263.  
  264.  
  265.  
  266.  
  267.  
  268. Tk_ParseArgv(3)       Tk Library Procedures
  269.  
  270.  
  271.  
  272.           any of the remaining arguments;  it returns them all at
  273.           the beginning of _a_r_g_v (along with any other unprocessed
  274.           arguments).  In addition, Tk_ParseArgv  treats  _d_s_t  as
  275.           the address of an integer value, and stores at *_d_s_t the
  276.           index of the first of the TK_ARGV_REST options  in  the
  277.           returned  _a_r_g_v.  This allows the program to distinguish
  278.           the TK_ARGV_REST options from other unprocessed options
  279.           that preceeded the TK_ARGV_REST.
  280.  
  281.      TK_ARGV_FUNC
  282.           For this kind  of  argument,  _s_r_c  is  treated  as  the
  283.           address of a procedure, which is invoked to process the
  284.           following argument.  The procedure should have the fol-
  285.           lowing structure:
  286.  
  287.           int
  288.           _f_u_n_c(_d_s_t, _k_e_y, _n_e_x_t_A_r_g)
  289.               char    *_d_s_t;
  290.               char    *_k_e_y;
  291.               char    *_n_e_x_t_A_r_g;
  292.           {
  293.           }
  294.  
  295.  
  296.           The _d_s_t and _k_e_y parameters will contain the correspond-
  297.           ing  fields  from  the _a_r_g_T_a_b_l_e entry, and _n_e_x_t_A_r_g will
  298.           point to the following argument from _a_r_g_v (or  NULL  if
  299.           there aren't any more arguments left in _a_r_g_v).  If _f_u_n_c
  300.           uses _n_e_x_t_A_r_g (so that Tk_ParseArgv should discard  it),
  301.           then  it should return 1.  Otherwise it should return 0
  302.           and TkParseArgv will process the following argument  in
  303.           the normal fashion.  In either event the matching argu-
  304.           ment is discarded.
  305.  
  306.      TK_ARGV_GENFUNC
  307.           This form provides a more  general  procedural  escape.
  308.           It treats _s_r_c as the address of a procedure, and passes
  309.           that procedure all of  the  remaining  arguments.   The
  310.           procedure should have the following form:
  311.  
  312.           int
  313.           _g_e_n_f_u_n_c(_d_s_t, _i_n_t_e_r_p, _k_e_y, _a_r_g_c, _a_r_g_v)
  314.               char    *_d_s_t;
  315.               Tcl_Interp  *_i_n_t_e_r_p;
  316.               char    *_k_e_y;
  317.               int _a_r_g_c;
  318.               char    **_a_r_g_v;
  319.           {
  320.           }
  321.  
  322.           The _d_s_t and _k_e_y parameters will contain the correspond-
  323.           ing fields from the _a_r_g_T_a_b_l_e entry.  _I_n_t_e_r_p will be the
  324.  
  325.  
  326.  
  327. Tk                                                              5
  328.  
  329.  
  330.  
  331.  
  332.  
  333.  
  334. Tk_ParseArgv(3)       Tk Library Procedures
  335.  
  336.  
  337.  
  338.           same as the _i_n_t_e_r_p argument to Tcl_ParseArgv.  _A_r_g_c and
  339.           _a_r_g_v  refer  to  all  of the options after the matching
  340.           one.  _G_e_n_f_u_n_c should behave in  a  fashion  similar  to
  341.           Tk_ParseArgv:  parse as many of the remaining arguments
  342.           as it can, then return any that are left by  compacting
  343.           them  to  the  beginning of _a_r_g_v (starting at _a_r_g_v[0]).
  344.           _G_e_n_f_u_n_c should return a count of how many arguments are
  345.           left  in _a_r_g_v; Tk_ParseArgv will process them.  If _g_e_n_-
  346.           _f_u_n_c encounters an error then it should leave an  error
  347.           message  in  _i_n_t_e_r_p->_r_e_s_u_l_t,  in the usual Tcl fashion,
  348.           and return -1;  when  this  happens  Tk_ParseArgv  will
  349.           abort its processing and return TCL_ERROR.
  350.  
  351.  
  352. FLAGS
  353.      TK_ARGV_DONT_SKIP_FIRST_ARG
  354.           Tk_ParseArgv normally treats _a_r_g_v[_0] as  a  program  or
  355.           command  name,  and returns it to the caller just as if
  356.           it hadn't matched _a_r_g_T_a_b_l_e.  If  this  flag  is  given,
  357.           then _a_r_g_v[_0] is not given special treatment.
  358.  
  359.      TK_ARGV_NO_ABBREV
  360.           Normally, Tk_ParseArgv accepts unique abbreviations for
  361.           _k_e_y  values  in  _a_r_g_T_a_b_l_e.   If this flag is given then
  362.           only exact matches will be acceptable.
  363.  
  364.      TK_ARGV_NO_LEFTOVERS
  365.           Normally, Tk_ParseArgv returns  unrecognized  arguments
  366.           to  the  caller.   If  this  bit  is  set in _f_l_a_g_s then
  367.           Tk_ParseArgv will return an error if it encounters  any
  368.           argument  that doesn't match _a_r_g_T_a_b_l_e.  The only excep-
  369.           tion to this rule is _a_r_g_v[_0], which will be returned to
  370.           the    caller    with    no    errors    as   long   as
  371.           TK_ARGV_DONT_SKIP_FIRST_ARG isn't specified.
  372.  
  373.      TK_ARGV_NO_DEFAULTS
  374.           Normally, Tk_ParseArgv searches an  internal  table  of
  375.           standard  argument  specifiers in addition to _a_r_g_T_a_b_l_e.
  376.           If this bit is set in _f_l_a_g_s, then Tk_ParseArgv will use
  377.           only _a_r_g_T_a_b_l_e and not its default table.
  378.  
  379.  
  380. EXAMPLE
  381.      Here is an example definition of an _a_r_g_T_a_b_l_e and some sample
  382.      command lines that use the options.  Note the effect on _a_r_g_c
  383.      and _a_r_g_v;  arguments processed  by  Tk_ParseArgv  are  elim-
  384.      inated  from  _a_r_g_v,  and  _a_r_g_c is updated to reflect reduced
  385.      number of arguments.
  386.  
  387.           /*
  388.            * Define and set default values for globals.
  389.            */
  390.  
  391.  
  392.  
  393. Tk                                                              6
  394.  
  395.  
  396.  
  397.  
  398.  
  399.  
  400. Tk_ParseArgv(3)       Tk Library Procedures
  401.  
  402.  
  403.  
  404.           int debugFlag = 0;
  405.           int numReps = 100;
  406.           char defaultFileName[] = "out";
  407.           char *fileName = defaultFileName;
  408.           Boolean exec = FALSE;
  409.  
  410.           /*
  411.            * Define option descriptions.
  412.            */
  413.           Tk_ArgvInfo argTable[] = {
  414.               {"-X", TK_ARGV_CONSTANT, (char *) 1, (char *) &debugFlag,
  415.                   "Turn on debugging printfs"},
  416.               {"-N", TK_ARGV_INT, (char *) NULL, (char *) &numReps,
  417.                   "Number of repetitions"},
  418.               {"-of", TK_ARGV_STRING, (char *) NULL, (char *) &fileName,
  419.                   "Name of file for output"},
  420.               {"x", TK_ARGV_REST, (char *) NULL, (char *) &exec,
  421.                   "File to exec, followed by any arguments (must be last argument)."},
  422.               {(char *) NULL, TK_ARGV_END, (char *) NULL, (char *) NULL,
  423.                   (char *) NULL}
  424.           };
  425.  
  426.           main(argc, argv)
  427.               int argc;
  428.               char *argv[];
  429.           {
  430.               ...
  431.  
  432.               if (Tk_ParseArgv(interp, tkwin, &argc, argv, argTable, 0) != TCL_OK) {
  433.                   fprintf(stderr, "%s\n", interp->result);
  434.                   exit(1);
  435.               }
  436.  
  437.               /*
  438.                * Remainder of the program.
  439.                */
  440.           }
  441.  
  442.  
  443.      Note that default values can be assigned to variables  named
  444.      in  _a_r_g_T_a_b_l_e:  the variables will only be overwritten if the
  445.      particular arguments are present in  _a_r_g_v.   Here  are  some
  446.      example command lines and their effects.
  447.  
  448.           prog -N 200 infile      # just sets the numReps variable to 200
  449.           prog -of out200 infile  # sets fileName to reference "out200"
  450.           prog -XN 10 infile      # sets the debug flag, also sets numReps
  451.      In  all  of  the  above  examples,  _a_r_g_c  will  be  set   by
  452.      Tk_ParseArgv to 2, _a_r_g_v[0] will be ``prog'', _a_r_g_v[1] will be
  453.      ``infile'', and _a_r_g_v[2] will be NULL.
  454.  
  455.  
  456.  
  457.  
  458.  
  459. Tk                                                              7
  460.  
  461.  
  462.  
  463.  
  464.  
  465.  
  466. Tk_ParseArgv(3)       Tk Library Procedures
  467.  
  468.  
  469.  
  470. KEYWORDS
  471.      arguments, command line, options
  472.  
  473.  
  474.  
  475.  
  476.  
  477.  
  478.  
  479.  
  480.  
  481.  
  482.  
  483.  
  484.  
  485.  
  486.  
  487.  
  488.  
  489.  
  490.  
  491.  
  492.  
  493.  
  494.  
  495.  
  496.  
  497.  
  498.  
  499.  
  500.  
  501.  
  502.  
  503.  
  504.  
  505.  
  506.  
  507.  
  508.  
  509.  
  510.  
  511.  
  512.  
  513.  
  514.  
  515.  
  516.  
  517.  
  518.  
  519.  
  520.  
  521.  
  522.  
  523.  
  524.  
  525. Tk                                                              8
  526.  
  527.  
  528.  
  529.